package com.eian.boot.helper;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.ScriptUtils;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.Connection;

/**
 * 数据库清理工具
 *
 * <p>负责在每次测试前清理数据库并初始化测试数据
 * <p><b>注意：</b>需要手动创建数据库表结构，请在首次运行前执行 docs/db/postgres_schema_init.sql
 *
 * @author test
 */
@Slf4j
@Component
public class DatabaseCleaner {

    @Autowired
    private DataSource dataSource;

    /**
     * 清理并初始化数据库
     * <p>执行步骤：
     * <ol>
     *   <li>执行清理脚本：清空所有业务表数据</li>
     *   <li>执行初始化脚本：插入测试基础数据</li>
     * </ol>
     *
     * <p><b>前置条件：</b>数据库表结构必须已存在。如未创建，请先执行：
     * <pre>psql -U postgres -d rbac_test -f docs/db/postgres_schema_init.sql</pre>
     */
    public void cleanAndInitDatabase() throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            log.info("开始清理数据库...");

            // 1. 执行清理脚本
            ClassPathResource cleanScript = new ClassPathResource("test-data/clean-database.sql");
            ScriptUtils.executeSqlScript(connection, cleanScript);
            log.info("数据库清理完成");

            // 2. 执行初始化脚本
            ClassPathResource initScript = new ClassPathResource("test-data/init-test-data.sql");
            ScriptUtils.executeSqlScript(connection, initScript);
            log.info("测试数据初始化完成");

        } catch (Exception e) {
            log.error("数据库清理或初始化失败", e);
            if (e.getMessage() != null && e.getMessage().contains("does not exist")) {
                log.error("❌ 错误提示：数据库表结构不存在！");
                log.error("请先手动执行schema初始化脚本：");
                log.error("   psql -U postgres -d rbac_test -f docs/db/postgres_schema_init.sql");
            }
            throw e;
        }
    }

    /**
     * 仅清理数据库（不初始化）
     */
    public void cleanDatabase() throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            log.info("清理数据库...");
            ClassPathResource cleanScript = new ClassPathResource("test-data/clean-database.sql");
            ScriptUtils.executeSqlScript(connection, cleanScript);
            log.info("数据库清理完成");
        } catch (Exception e) {
            log.error("数据库清理失败", e);
            throw e;
        }
    }

    /**
     * 仅初始化数据库（不清理）
     */
    public void initDatabase() throws Exception {
        try (Connection connection = dataSource.getConnection()) {
            log.info("初始化测试数据...");
            ClassPathResource initScript = new ClassPathResource("test-data/init-test-data.sql");
            ScriptUtils.executeSqlScript(connection, initScript);
            log.info("测试数据初始化完成");
        } catch (Exception e) {
            log.error("测试数据初始化失败", e);
            throw e;
        }
    }
}

